#define _GNU_SOURCE
#include "fastxml.h"
#include <string.h>

// 超简化的XML解析器，用于调试
xml_document_t* xml_parse_string_minimal(const char *xml_string) {
    if (!xml_string) {
        printf("Debug: XML字符串为空\n");
        return NULL;
    }
    
    printf("Debug: 开始解析XML: %s\n", xml_string);
    
    xml_document_t *doc = malloc(sizeof(xml_document_t));
    if (!doc) {
        printf("Debug: 无法分配文档内存\n");
        return NULL;
    }
    
    doc->root = NULL;
    doc->version = NULL;
    doc->encoding = NULL;
    
    // 查找第一个 '<'
    const char *start = strchr(xml_string, '<');
    if (!start) {
        printf("Debug: 未找到开始标签\n");
        free(doc);
        return NULL;
    }
    
    // 跳过 '<'
    start++;
    
    // 查找标签名结束位置
    const char *tag_end = start;
    while (*tag_end && *tag_end != '>' && *tag_end != ' ' && *tag_end != '/') {
        tag_end++;
    }
    
    if (tag_end == start) {
        printf("Debug: 标签名为空\n");
        free(doc);
        return NULL;
    }
    
    // 提取标签名
    int tag_len = tag_end - start;
    char *tag_name = malloc(tag_len + 1);
    if (!tag_name) {
        printf("Debug: 无法分配标签名内存\n");
        free(doc);
        return NULL;
    }
    
    strncpy(tag_name, start, tag_len);
    tag_name[tag_len] = '\0';
    
    printf("Debug: 提取的标签名: '%s' (长度: %d)\n", tag_name, tag_len);
    
    // 创建根节点
    printf("Debug: 准备创建根节点，标签名: '%s'\n", tag_name);
    doc->root = xml_create_node(XML_NODE_ELEMENT, tag_name, NULL);
    if (!doc->root) {
        printf("Debug: 无法创建根节点\n");
        free(tag_name);
        free(doc);
        return NULL;
    }
    
    printf("Debug: 根节点创建成功，名称: '%s'\n", doc->root->name ? doc->root->name : "NULL");
    
    // 查找内容开始位置（跳过到 '>'）
    const char *content_start = strchr(tag_end, '>');
    if (!content_start) {
        printf("Debug: 未找到标签结束符 '>'\n");
        free(tag_name);
        xml_free_document(doc);
        return NULL;
    }
    content_start++; // 跳过 '>'
    
    // 查找结束标签
    char end_tag[256];
    snprintf(end_tag, sizeof(end_tag), "</%s>", tag_name);
    
    const char *content_end = strstr(content_start, end_tag);
    if (content_end) {
        // 提取内容
        int content_len = content_end - content_start;
        if (content_len > 0) {
            char *content = malloc(content_len + 1);
            if (content) {
                strncpy(content, content_start, content_len);
                content[content_len] = '\0';
                
                // 简单去除空白
                char *trimmed = content;
                while (*trimmed && isspace(*trimmed)) trimmed++;
                if (*trimmed) {
                    char *end = trimmed + strlen(trimmed) - 1;
                    while (end > trimmed && isspace(*end)) *end-- = '\0';
                    if (*trimmed) {
                        doc->root->content = strdup(trimmed);
                        printf("Debug: 设置内容: '%s'\n", doc->root->content);
                    }
                }
                free(content);
            }
        }
    }
    
    free(tag_name);
    printf("Debug: 解析完成\n");
    return doc;
}

int main() {
    printf("最小化XML解析器测试\n");
    printf("====================\n\n");
    
    const char *test_xml = "<root>Hello World</root>";
    
    printf("测试XML: %s\n\n", test_xml);
    
    xml_document_t *doc = xml_parse_string_minimal(test_xml);
    if (doc) {
        printf("\n解析成功!\n");
        if (doc->root) {
            printf("根节点名称: %s\n", doc->root->name ? doc->root->name : "NULL");
            printf("根节点内容: %s\n", doc->root->content ? doc->root->content : "NULL");
        }
        
        printf("\n正在释放内存...\n");
        xml_free_document(doc);
        printf("内存释放完成\n");
    } else {
        printf("解析失败!\n");
    }
    
    printf("\n程序结束\n");
    return 0;
}